English version Spanish version German version

Sessione 5: Un Modello di Gestione di Produzione con Impianti Multipli

Quando formulate un modello per compagnie più grandi, incontrate frequentemente modelli, finalizzati alla produzione di un prodotto, che non sono limitati ad un singolo impianto. Dunque, in questa sessione, creerete un modello di gestione di produzione che includa impianti multipli. Prenderete il modello dalla sessione precedente e lo aggiornerete al fine di includere un altro indice, Impianti,che rappresenterà tutti gli impianti che sono disponibili al fine di produrre il prodotto. Attraverserete, dunque, il modello, passo per passo, e aggiornerete tutti i vettori di variabile e i limiti per rappresentare il nuovo indice.


Nuovi Concetti in Questa Sessione

Impianti e altri; Indici di Posizione

Gli Indici di Posizione sono abbastanza comuni quando formulate un modello di gestione di produzione. Un esempio d' indice di posizione, potrebbe essere la rappresentazione d' impianti là dove una compagnia produce i prodotti per sé stessa. Altri esempi includerebbe magazzini, industrie, centri di distribuzione, etc.

E' cosa comune,; quando si lavora con modelli che includono indici di posizione, che sia permesso il trasporto tra le posizioni. Questi modelli sono spesso chiamati;modelli di trasporto o di distribuzione e saranno affrontati più in là in questa sessione.

File esterni di Dati

Quando formulate piccoli e semplici modelli è ragionevole lasciare le definizioni di dati all'interno del modello. Nel momento in cui cominciate a lavorare con modelli multi-dimensionali, diventa difficile da gestire, ed è necessario spostare i dati in files separati. Lasciare i dati separati dal modello, aumenta la leggibilità del modello e rende i dati più semplici da conservare.

Il modello che state creando in questa sessione possiede indici multipli, prodotto, mese e impiantoe vettori di dati come richiesta, che è bi-dimensionale e può essere spostato in un file separato. Nel modello, invece di una lista di tutti gli elementi di dati per il vettore di dati, potete usare la parola chiave DATAFILE e poi il nome del file di dati come mostrato qui sotto:

     demand[product, month]   :=  DATAFILE("Demand.dat");
    

Descrizione del Problema: Un Modello di Gestione di Produzione con Impianti Multipli

In questa Sessione, creerete una nuova formulazione di modello per il modello di Programmazione di Produzione al fine di includere impianti multipli, così come i periodi multipli che sono stati introdotti nella Sessione 4. Quello che si vuole decidere è quanto produrre per ogni prodotto, per ogni mese, in ogni impianto, così come quanto vendere e immagazzinare nell'inventario, per ogni mese, in ogni impianto.;

In questo nuovo problema avrete quattro diversi impianti p1, p2, p3, e p4. Ognuno di questi impianti può produrre tutti e tre i prodotti. Create un indice chiamato impianti che contenga i quattro differenti impianti, e poi aggiornate il modello di conseguenza aggiungendo l'indice ai vettori applicabili.

Come nella sessione precedente, il prezzo di vendita è rimasto lo stesso per ogni prodotto $120.00, $100.00, e $150.00, rispettivamante. Anche la richiesta del prodotto è rimasta la stessa come nella sessione precedente. Rifarsi alla tabella della richiesta nella Sessione 3 per i dati necessari.

Ora che avete impianti multipli, il costo della produzione per ogni prodotto è differente per ogni impianto. Questo dato si trova nella tabella sottostante:

Il tasso di produzione per ogni prodotto è inltre diverso per ogni impianto come mostrato nella tabella sottostante


Formulazione del Modello in MPL

Elencata di seguito troverete l'intera formulazione del modello per il Planning5. Le aggiunte al modello sono sottolineate in neretto per rendervi più facile notare i cambiamenti dal modello nella Sessione 4.

     TITLE
        Production_Planning5;

     INDEX
        product := (A1, A2, A3);
        month   := (Jan, Feb, Mar, Apr);
        plant   := (p1, p2, p3, p4);

     DATA
        Price[product]            :=  (120.00, 100.00, 115.00);
        Demand[product, month]    :=  DATAFILE("Demand.dat");

        ProdCost[plant, product]  :=  DATAFILE("ProdCost.dat");
        ProdRate[plant, product]  :=  DATAFILE("ProdRate.dat");

        ProdDaysAvail[month]      :=  (23, 20, 23, 22);
        InvtCost[product]         :=  (3.50, 4.00, 3.00);
        InvtCapacity              :=  800;

     VARIABLES
        Produce[plant, product, month]  -> Prod;
        Inventory[product, month]       -> Invt;
        Sales[product, month]           -> Sale;

     MACROS
        TotalRevenue   := SUM(product, month: Price * Sales);
        TotalProdCost  := SUM(plant, product, month: ProdCost * Produce);
        TotalInvtCost  := SUM(product, month: InvtCost * Inventory);
        TotalCost      := TotalProdCost + TotalInvtCost;

     MODEL

        MAX  Profit  =  TotalRevenue - TotalCost;

     SUBJECT TO
        ProdCapacity[plant, month] -> PCap:
           SUM(product: Produce / ProdRate)  <=  ProdDaysAvail;

        InvtBal[product, month] -> IBal:
           SUM(plant: Produce) + Inventory[month-1]  =  Sales + Inventory;

        MaxInventory[month] -> MaxI:
           SUM(product: Inventory)  <=  InvtCapacity;

     BOUNDS
        Sales  <=  Demand;

     END
   

Introdurre Nuovi Elementi al Modello Passo per Passo

Passo 1: Eseguire MPL e Creare un Nuovo Modello

  1. Eseguire l'applicazione MPL.

  2. Scegliere; File (Archivio) | Open (Aprire) e aprire il modello dalla Sessione precedente Planning4.mpl.

  3. Scegliere; File (Archivio) | Save As (Salvare come) per salvarlo come un nuovo file di modello Planning5.mpl.

Passo 2: Cambiare Titolo al Modello

Cambiare titolo al modello per sottolineare che state lavorando con il modello Planning5:

     TITLE
        Production_Planning5;
    

Passo 3: Aggiungere l'Indice di Posizione 'plant'(impianto) al modello

In questo esempio, avete quattro diverse posizioni d'impianto. Create un nuovo indice che chiamerete plant (impianto). Questo indice avrà quattro elementi p1, p2, p3, e p4 per rappresentare ogni periodo del periodo di gestione di quattro mesi. Aggiungere la seguente definizione per l'indice; plant (impianto) alla sezione INDEX (INDICE):

     INDEX
        product :=  (A1, A2, A3);
        month   :=  (Jan, Feb, Mar, Apr);
        plant   :=  (p1, p2, p3, p4);
    

Passo 4: Cambiare la definizione del Vettore di Dati 'Demand' (Richiesta) per Leggere i Dati da un file esterno di Dati

In questa sessione, sposterete i valori dei dati per i loro vettori bi-dimensionali ad un file esterno di dati.Quando lavorate con vettori di dati che hanno due o più dimensioni, è spesso buona idea spostare i valori dei dati in un file di dati esterno invece di elencare tutti i numeri direttamente in un file di modello. Questo mantiene i dati separati dal modello, migliora la leggibilità del modello, e rende i dati più facilmente conservabili.

Il primo vettore di dati che si desidererà spostare in un file esterno è il vettore di dati Demand (Richiesta). Nella sezione DATA (DATI) usare il comando Cut (Tagliare) dal menu Edit per rimuovere l'elenco di numeri per il vettore Demand (Richiesta) e poi introdurre la parola chiave DATAFILE e il file di nome Demand.dat al suo posto come segue:

     DATA
        Price[product]          :=  (120.00, 100.00, 115.00);
        Demand[product, month]  :=  DATAFILE("Demand.dat");
    

Passo 5: Creare il File di Dati 'Demand.dat'

Il prossimo passo sarà creare un file di dati Demand.dat.; Come prima cosa, aprire una nuova finestra editor di modello scegliendo New (Nuovo) nel menu File. Se avete usato il comando Edit | Cut nel precedente Passo 4 per togliere i valori dei dati, li troverete ora nella Clipboard e potrete usare il comando Edit | Paste per rimettere i dati nel file di dati. Altrimenti, potete usare la tabella di richiesta di dati dalla descrizione del problema nella Sessione 3 per introdurre i valori dei dati nel file di come segue

     !  Demand.dat  -  Demand per month for each product
     !
     !  Demand[product,month]:
     !
     !          Jan    Feb    Mar    Apr
     !        ----------------------------
               4300,  4200,  6400,  5300,
               4500,  5400,  6500,  7200,
               5400,  6700,  7800,  8200
    

Le linee che cominciano con un punto esclamativo sono commenti usati per migliorare la leggibilità. I numeri nel file di dati possono essere separati con una virgola, uno spazio o con entrambi. Dopo aver introdotto tutti i dati, salvate il file come Demand.dat nella cartella Tutorial.

Passo 6: Aggiornare i vettori di dati 'ProdCost' e 'ProdRate' per includere l'Indice 'plant'

Due, tra i vettori di dati, ProdCost e ProdRate, devono essere aggiornati al fine d'includere l'indice plant. Il vettore di dati ProdCost è ora definito su due indici di dominio, plant(impianto) e product (prodotto) saranno dati valori di dati da un file esterno. Il vettore di dati ProdRate fornirà, inoltre, i valori dal file di dati. Nell'editor del modello, aggiungere l'inidice, plant, per dichiarare entrambi i vettori di dati ProdCost e ProdRate, seguiti con i filenames di dati ProdCost.dat e ProdRate.dat rispettivamante come segue:

        ProdCost[plant, product]  :=  DATAFILE("ProdCost.dat");
        ProdRate[plant, product]  :=  DATAFILE("ProdRate.dat");
        ProdDaysAvail[month]      :=  (23, 20, 23, 22);
        InvtCost[product]         :=  (3.50, 4.00 3.00);
        InvtCapacity              :=  800;
    

Passo 7: Creare Files di Dati per i vettori di dati 'ProdCost' e 'ProdRate'

Ora aprite una nuova finestra di editor selezionando File (Archivio)| New (Nuovo) nel menu per introdurre il file di dati. Inserire nei dati dalla tabella Production Cost nella descrizione del problema come segue:

     !
     !  ProdCost.dat  -  Cost per item produced
     !
     !  ProdCost[plant, product]:
     !
     !           A1      A2      A3
     !        -----------------------
               73.30,  52.90,  65.40,
               79.00,  52.00,  66.80,
               75.80,  52.10,  50.90,
               82.70,  63.30,  53.80
    

Di nuovo, le linee che cominciano con un punto esclamativo sono commenti usati per migliorare la leggibilità. Dopo che avete inserito tutti i dati, salvate il file usando il nome ProdCost.dat.

Per il tasso di produzione creare un nuovo file di dati chiamato ProdRate.dat usando i valori dalla tabella nella descrizione del problema.

     !
     !  ProdRate.dat  -  Items produced per day
     !
     !  ProdRate[plant, product]:
     !
     !          A1    A2    A3
     !        ------------------
               500,  450,  450,
               550,  450,  300,
               450,  350,  300,
               550,  400,  350
    

Passo 8: Aggiornare la Variabile 'Produce'(Prodotto) così da includere l'Indice 'plant'(Impianto)

Per determinare quanto si vuole produrre per ogni prodotto, per ogni impianto, si deve aggiungere l'indice plant (impianto) alla definizione del vettore della variabile Produce (Prodotto)come segue:

     VARIABLES
        Produce[plant, product, month] -> Prod;
        Inventory[product, month]      -> Invt;
        Sales[product, month]          -> Sale;
    

Passo 9: Aggiungere l'Indice 'plant' (Impianto)alla Sommatoria 'TotalProdCost'

Dato che la variabile di vettore Produce (Prodotto), ora include il nuovo indice, plant (impianto), il calcolo del costo totale della produzione nella sezione MACROS ha, inoltre, bisogno di essere aggiornata per includere l'indice plant:

     MACROS
        TotalRevenue   := SUM(product, month: Price * Sales);
        TotalProdCost  := SUM(plant, product, month: ProdCost * Produce) ;
        TotalInvtCost  := SUM(product, month: InvtCost * Inventory);
        TotalCost      := TotalProdCost + TotalInvtCost;
    

La funzione obiettivo in sè, non cambia siccome state usando le stesse macro come nelle sessione precedente.

Passo 10: Aggiungere l'Indice 'plant' al Vincolo 'ProdCapacity'

Il cambiamento per i vincoli della capacità di produzione è molto semplice. Aggiungere l'indice plant alla dichiarazione della capacità di produzione e il resto del vincolo rimane lo stesso.

     SUBJECT TO
        ProdCapacity[plant, month] -> PCap:
           SUM(product: Produce / ProdRate)  <=  ProdDaysAvail;
    

Passo 11: Aggiungere la Sommatoria della Variabile 'Produce';(Prodotto) sull'Indice 'plant'(Impianto) al Vincolo di Equilibrio dell'Inventario.

Si può ora produrre i prodotti in ognuno dei quattro impianti, dunque, bisogna aggiornare il vincolo d'equilibrio del'inventario per includere la sommatoria, su tutti gli impianti, del vettore di variabile Produce.

     InvtBal[product, month] -> IBal:
        SUM(plant: Produce) + Inventory[month-1]  =  Sales + Inventory;

Dopo aver terminato d'introdurre il modello, dovreste salvarlo scegliendo Save (Salvare)dal menu File (Archivio).


Risolvere il Modello e Analizzare la Soluzione

Dato che abbiamo aggiunto più indici al modello, il numero delle variabili è aumentato considerevolmente. Tipicamente, quando si lavora con ampi modelli, chi sviluppa il modello vuole includere solo alcuni dei valori nella soluzione. Nel nostro caso, per ridurre i dati in uscita, vogliamo includere solo le variabili che hanno valori di soluzione diversi da zero. MPL possiede un numero di finestre di dialogo di opzioni nel menu Options (Opzioni) in cui è possibile cambiare il carattere di default del programma. Una delle finestre di dialogo è la Solution File Options (Opzioni d'Archivio delle Soluzioni) dove potete aggiustare ciò che è incluso nel file di soluzione. Per cambiare il default al fine d'includere i valori diversi da zero solo nel file di soluzione fare ciò che segue:

  1. Dal menu Options (Opzioni) scegliere Solution File (File di Soluzione) per aprire Options Dialog Box (Finestra di Dialogo di Opzioni) mostrato qui sotto:

  2. La Finestra di Dialogo di Opzioni del File di Soluzione

  3. Accendere la finestra di controllo Nonzero Values Only (Solo Valori Differenti da Zero)cliccandoci sopra.

  4. Chiudere la finestra di dialogo premendo il bottone; OK.

Dopo aver cambiato l'opzione Nonzero Values Only (Solo Valori Differenti da Zero), il prossimo passo sarà risolvere il modello scegliendo Solve CPLEX; dal menu; Run (Eseguire). Se tutto procede bene MPL visualizzerà il messaggio "Optimal Solution Found" (Trovata Soluzione Ottimale). Se c'è una finestra con un messaggio d'errore di sintassi per favore, controllare la formulazione inserita nel dettaglio precedentemente in questa sessione, con la lista del modello.

Dato che il modello con cui state lavorando sta diventando più grande, cercate di guardare solo alcune parti della soluzione, invece che l'intero file di soluzione. Questa volta, invece che elencare l'intero file di soluzione, useremo la finestra di modello ad albero di definizioni, al fine di visulaizzare solo le parti della soluzione che c'interessano.

La finestra di definizioni del modello vi permette di vedere tutti gli articoli definiti dalla formulazione del modello in un albero gerarchico in cui ogni ramo corrisponde ad una sezione del modello. In MPL è, normalmente, buona idea lasciare la finestra ad albero sempre aperta. MPL, poi, aggiornerà automaticamente i suoi contenuti tutte le volte che risolverete il modello. Guardando le definizioni del modello per il Planning5 scegliere Model Definitions (Definizioni del Modello) dal menu View (Vista).

La Finestra di Definizioni del Modello per il; Planning5

Dalla finestra ad albero, potete selezionare ogni articolo definito nel modello guardando i valori reali di quest'ultimo. Per esempio, guardando i valori per la variabile Produce (Prodotto), fare doppio click sull'articolo Produce (Prodotto) nell' albero, o selezionarlo e poi premere il bottoneView(Vista). Questo visualizzerà una finestra che contiene solo i valori per la variabile Produce (Prodotto).

     VARIABLE Produce[plant,product,month] :

       plant  product  month           Activity     Reduced Cost
      -----------------------------------------------------------
       p1     A1       Jan           4300.0000           0.0000
       p1     A1       Feb           4200.0000           0.0000
       p1     A1       Mar           6400.0000           0.0000
       p1     A1       Apr           5300.0000           0.0000
       p2     A2       Jan           4500.0000           0.0000
       p2     A2       Feb           5400.0000           0.0000
       p2     A2       Mar           6500.0000           0.0000
       p2     A2       Apr           7200.0000           0.0000
       p3     A3       Jan           5400.0000           0.0000
       p3     A3       Feb           6000.0000           0.0000
       p3     A3       Mar           6900.0000           0.0000
       p3     A3       Apr           6600.0000           0.0000
       p4     A3       Feb            700.0000           0.0000
       p4     A3       Mar            900.0000           0.0000
       p4     A3       Apr           1600.0000           0.0000
       -----------------------------------------------------------
     

Se si guardano i valori di attività per la variabile Produce (Prodotto) vedrete che questa volta stiamo riempiendo la richiesta per tutti i prodotti dato che ora abbiamo abbastanza capacità. Il modello decide quali impianti vengono usati q per quali prodotti.Per esempio, l'impianto p1 viene usato per produrre il prodotto A1, l'impianto p2 viene usato per il prodotto A2, e gli impiantip3 e p4 vengono usati per il prodotto A3.

Se andate ancora alla finestra ad albero e aprite la finestra per il vincolo ProdCapacity avrete i seguenti valori di soluzione

CONSTRAINT ProdCapacity[plant,month] :

plant month Slack Shadow Price
p1 Jan 14.4000 0.0000
p1 Feb 11.6000 0.0000
p1 Mar 10.2000 0.0000
p1 Apr 11.4000 0.0000
p2 Feb 8.0000 0.0000
p2 Mar 8.5556 0.0000
p2 Apr 6.0000 0.0000
p3 Jan 5.0000 0.0000
p4 Jan 23.0000 0.0000
p4 Feb 18.0000 0.0000
p4 Mar 20.4286 0.0000
p4 Apr 17.4286 0.0000

Back To Top | Maximal Home Page | Overview | Previous Page | Next Page